package utility.ftp;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.SocketException;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.omg.CORBA.portable.ApplicationException;


public class FTPUpload {

    private static final String FTP_HOST = "127.0.0.1";
    private static final String FTP_USER = "username";
    private static final String FTP_PASSWORD = "password";

    private static final String UPLOAD_FILE = "C:\\サンプル.txt";
    private static final String UPLOADED_FILENAME = "リネーム.xls";

    public static void main(String[] args) {
        try {
            execute();
        } catch (ApplicationException e) {
            e.printStackTrace();
        }
    }

    private static void execute() throws ApplicationException {

        FTPClient ftpClient = new FTPClient();

        try {
            // エンコーディングの設定は、connectする前に行う。
            ftpClient.setControlEncoding("SJIS");

            // FTPサーバに接続
            ftpClient.connect(FTP_HOST);
            printFtpReply(ftpClient);

            // ログイン
            ftpClient.login(FTP_USER, FTP_PASSWORD);
            printFtpReply(ftpClient);

            // PASVモードに設定
            ftpClient.pasv();
            printFtpReply(ftpClient);

            // データの変換モードをバイナリに設定
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
            printFtpReply(ftpClient);

            // ファイル転送
            FileInputStream fis = new FileInputStream(UPLOAD_FILE);
            ftpClient.storeFile(UPLOADED_FILENAME, fis);
            printFtpReply(ftpClient);

        } catch (NumberFormatException e) {
            // throw new ApplicationException("FTPポートの値が数値ではありません。", e);
        } catch (SocketException e) {
            // throw new ApplicationException("Socket通信に失敗しました。", e);
        } catch (FileNotFoundException e) {
            // throw new ApplicationException("アップロードするファイルが見つかりません。", e);
        } catch (IOException e) {
            // throw new ApplicationException("IOレベルで例外が発生しました。", e);
        } finally {
            if (ftpClient.isConnected()) {
                try {
                    ftpClient.disconnect();
                } catch (IOException e) {
                    // ignore
                }
            }
        }
    }

    private static void printFtpReply(FTPClient ftpClient)throws ApplicationException {

        System.out.print(ftpClient.getReplyString());

        int replyCode = ftpClient.getReplyCode();

        if (!FTPReply.isPositiveCompletion(replyCode)) {
            //throw new ApplicationException("送信したFTPコマンドは失敗しました。");]
        }
    }
}